#include<iostream>
#include<queue>
#include<cstring>

using namespace std;
typedef pair<int,int> PII;
const int N=1e3+10;
int numset[N][N];
bool st[N][N];
int n,m;

int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
bool bfs(int bitflag)
{
	memset(st,0,sizeof st);
	queue<PII> q;
	for(int i=1;i<=m;i++)
	{
		q.push({1,i});
		st[1][i]=true;
	}

	while(q.size())
	{
		int x=q.front().first;
		int y=q.front().second;
		q.pop();
		for(int i=0;i<4;i++)
		{
			int a=x+dx[i];
			int b=y+dy[i];
			if(a<=n&&b<=m&&a>=1&&b>=1
				&&numset[a][b]<=bitflag
				&&st[a][b]==false)
			{
				q.push({a,b});
				st[a][b]=true;
				if(a==n)
				{
					return true;
				}
			}
		}
	}
	return false;
}
int main()
{
	cin>>n>>m;
	int l=0,r=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>numset[i][j];
			r=max(r,numset[i][j]);
		}
	}


	while(l<r)
	{
		int mid=(r+l)>>1;

		if(bfs(mid))
		{
			r=mid;
		}
		else
		{
			l=mid+1;
		}
	}

	cout<<l<<endl;
}